package com.ccubee.data.transfer.transfer.monitor;

import com.google.common.collect.Maps;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;

/**
 * 数据传输监控
 *
 * @Author ycf
 * @Date 2022/11/17 18:27
 * @Version 1.0
 */
public final class DataTransferMonitor {

    private final static Map<String, Map<String, Map<String, MonitorProperties>>> MONITOR_MAP = new ConcurrentHashMap<>(16);

    /**
     * 获取监控数据
     *
     * @return 结果
     */
    public static Map<String, Map<String, Map<String, MonitorProperties>>> monitor() {
        return MONITOR_MAP;
    }

    /**
     * 监控数据
     *
     * @param instance 实例
     * @return 结果
     */
    public static Map<String, Map<String, MonitorProperties>> monitor(String instance) {
        return MONITOR_MAP.computeIfAbsent(instance, i -> Maps.newConcurrentMap());
    }

    /**
     * 监控数据
     *
     * @param instance 实例
     * @param dbKey    数据库
     * @return 结果
     */
    public static Map<String, MonitorProperties> monitor(String instance, String dbKey) {
        return monitor(instance).computeIfAbsent(dbKey, i -> Maps.newConcurrentMap());
    }

    /**
     * 监控数据
     *
     * @param instance 实例
     * @param dbKey    数据库
     * @param tableKey 表格
     * @return 结果
     */
    public static MonitorProperties monitor(String instance, String dbKey, String tableKey) {
        return monitor(instance, dbKey).computeIfAbsent(tableKey, i -> MonitorProperties.builder().build());
    }

    /**
     * 监控数据
     *
     * @param instance 实例
     * @param dbKey    数据库
     * @param tableKey 表格
     * @return 结果
     */
    public static MonitorProperties monitorGet(String instance, String dbKey, String tableKey) {
        return monitor(instance, dbKey).get(tableKey);
    }

    /**
     * 监控数据
     *
     * @param instance          实例
     * @param dbKey             数据库
     * @param tableKey          表格
     * @param monitorProperties 监控属性
     * @param reset             是否重制
     * @return 结果
     */
    public static MonitorProperties monitor(String instance, String dbKey, String tableKey, Supplier<MonitorProperties> monitorProperties, boolean reset) {
        if (reset) {
            MonitorProperties monitorProperties1 = monitorProperties.get();
            monitor(instance, dbKey).put(tableKey, monitorProperties1);
            return monitorProperties1;
        } else {
            return monitor(instance, dbKey).computeIfAbsent(tableKey, i -> monitorProperties.get());
        }
    }


    /**
     * 监控数据
     *
     * @param instance 实例
     * @param dbKey    数据库
     * @param tableKey 表格
     * @param start    当前计数
     * @return 结果
     */
    public static MonitorProperties monitor(String instance, String dbKey, String tableKey, Long start) {
        return monitor(instance, dbKey, tableKey).setStart(start);
    }

    /**
     * 监控数据
     *
     * @param instance 实例
     * @param dbKey    数据库
     * @param tableKey 表格
     * @param run      是否运行
     * @return 结果
     */
    public static MonitorProperties monitor(String instance, String dbKey, String tableKey, boolean run, Long start) {
        return monitor(instance, dbKey, tableKey).setRun(run).setStart(start);
    }

    /**
     * 监控数据
     *
     * @param instance 实例
     * @param dbKey    数据库
     * @param tableKey 表格
     * @param run      是否运行
     * @return 结果
     */
    public static MonitorProperties monitor(String instance, String dbKey, String tableKey, boolean run) {
        return monitor(instance, dbKey, tableKey).setRun(run).setRun(run);
    }
}
